/**
 * $Revision$
 * $Date$
 *
 * Copyright 2003-2007 Jive Software.
 *
 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jivesoftware.smackx.workgroup.packet;

import org.jivesoftware.smack.packet.IQ;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Represents a list of conversation transcripts that a user had in all his
 * history. Each transcript summary includes the sessionID which may be used for
 * getting more detailed information about the conversation.
 * {@link org.jivesoftware.smackx.workgroup.packet.Transcript}
 * 
 * @author Gaston Dombiak
 */
public class Transcripts extends IQ {

	private static final SimpleDateFormat UTC_FORMAT = new SimpleDateFormat(
			"yyyyMMdd'T'HH:mm:ss");
	static {
		UTC_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+0"));
	}

	private String userID;
	private List<Transcripts.TranscriptSummary> summaries;

	/**
	 * Creates a transcripts request for the given userID.
	 * 
	 * @param userID
	 *            the id of the user to get his conversations transcripts.
	 */
	public Transcripts(String userID) {
		this.userID = userID;
		this.summaries = new ArrayList<Transcripts.TranscriptSummary>();
	}

	/**
	 * Creates a Transcripts which will contain the transcript summaries of the
	 * given user.
	 * 
	 * @param userID
	 *            the id of the user. Could be a real JID or a unique String
	 *            that identifies anonymous users.
	 * @param summaries
	 *            the list of TranscriptSummaries.
	 */
	public Transcripts(String userID,
			List<Transcripts.TranscriptSummary> summaries) {
		this.userID = userID;
		this.summaries = summaries;
	}

	/**
	 * Returns the id of the user that was involved in the conversations. The
	 * userID could be a real JID if the connected user was not anonymous.
	 * Otherwise, the userID will be a String that was provided by the anonymous
	 * user as a way to idenitify the user across many user sessions.
	 * 
	 * @return the id of the user that was involved in the conversations.
	 */
	public String getUserID() {
		return userID;
	}

	/**
	 * Returns a list of TranscriptSummary. A TranscriptSummary does not contain
	 * the conversation transcript but some summary information like the
	 * sessionID and the time when the conversation started and finished. Once
	 * you have the sessionID it is possible to get the full conversation
	 * transcript.
	 * 
	 * @return a list of TranscriptSummary.
	 */
	public List<Transcripts.TranscriptSummary> getSummaries() {
		return Collections.unmodifiableList(summaries);
	}

	public String getChildElementXML() {
		StringBuilder buf = new StringBuilder();

		buf.append(
				"<transcripts xmlns=\"http://jivesoftware.com/protocol/workgroup\" userID=\"")
				.append(userID).append("\">");

		for (TranscriptSummary transcriptSummary : summaries) {
			buf.append(transcriptSummary.toXML());
		}

		buf.append("</transcripts>");

		return buf.toString();
	}

	/**
	 * A TranscriptSummary contains some information about a conversation such
	 * as the ID of the session or the date when the conversation started and
	 * finished. You will need to use the sessionID to get the full conversation
	 * transcript.
	 */
	public static class TranscriptSummary {
		private String sessionID;
		private Date joinTime;
		private Date leftTime;
		private List<AgentDetail> agentDetails;

		public TranscriptSummary(String sessionID, Date joinTime,
				Date leftTime, List<AgentDetail> agentDetails) {
			this.sessionID = sessionID;
			this.joinTime = joinTime;
			this.leftTime = leftTime;
			this.agentDetails = agentDetails;
		}

		/**
		 * Returns the ID of the session that is related to this conversation
		 * transcript. The sessionID could be used for getting the full
		 * conversation transcript.
		 * 
		 * @return the ID of the session that is related to this conversation
		 *         transcript.
		 */
		public String getSessionID() {
			return sessionID;
		}

		/**
		 * Returns the Date when the conversation started.
		 * 
		 * @return the Date when the conversation started.
		 */
		public Date getJoinTime() {
			return joinTime;
		}

		/**
		 * Returns the Date when the conversation finished.
		 * 
		 * @return the Date when the conversation finished.
		 */
		public Date getLeftTime() {
			return leftTime;
		}

		/**
		 * Returns a list of AgentDetails. For each Agent that was involved in
		 * the conversation the list will include an AgentDetail. An AgentDetail
		 * contains the JID of the agent as well as the time when the Agent
		 * joined and left the conversation.
		 * 
		 * @return a list of AgentDetails.
		 */
		public List<AgentDetail> getAgentDetails() {
			return agentDetails;
		}

		public String toXML() {
			StringBuilder buf = new StringBuilder();

			buf.append("<transcript sessionID=\"").append(sessionID)
					.append("\">");

			if (joinTime != null) {
				buf.append("<joinTime>").append(UTC_FORMAT.format(joinTime))
						.append("</joinTime>");
			}
			if (leftTime != null) {
				buf.append("<leftTime>").append(UTC_FORMAT.format(leftTime))
						.append("</leftTime>");
			}
			buf.append("<agents>");
			for (AgentDetail agentDetail : agentDetails) {
				buf.append(agentDetail.toXML());
			}
			buf.append("</agents></transcript>");

			return buf.toString();
		}
	}

	/**
	 * An AgentDetail contains information of an Agent that was involved in a
	 * conversation.
	 */
	public static class AgentDetail {
		private String agentJID;
		private Date joinTime;
		private Date leftTime;

		public AgentDetail(String agentJID, Date joinTime, Date leftTime) {
			this.agentJID = agentJID;
			this.joinTime = joinTime;
			this.leftTime = leftTime;
		}

		/**
		 * Returns the bare JID of the Agent that was involved in the
		 * conversation.
		 * 
		 * @return the bared JID of the Agent that was involved in the
		 *         conversation.
		 */
		public String getAgentJID() {
			return agentJID;
		}

		/**
		 * Returns the Date when the Agent joined the conversation.
		 * 
		 * @return the Date when the Agent joined the conversation.
		 */
		public Date getJoinTime() {
			return joinTime;
		}

		/**
		 * Returns the Date when the Agent left the conversation.
		 * 
		 * @return the Date when the Agent left the conversation.
		 */
		public Date getLeftTime() {
			return leftTime;
		}

		public String toXML() {
			StringBuilder buf = new StringBuilder();

			buf.append("<agent>");

			if (agentJID != null) {
				buf.append("<agentJID>").append(agentJID).append("</agentJID>");
			}
			if (joinTime != null) {
				buf.append("<joinTime>").append(UTC_FORMAT.format(joinTime))
						.append("</joinTime>");
			}
			if (leftTime != null) {
				buf.append("<leftTime>").append(UTC_FORMAT.format(leftTime))
						.append("</leftTime>");
			}
			buf.append("</agent>");

			return buf.toString();
		}
	}
}
